package scala

object Demo17List {
  def main(args: Array[String]): Unit = {

    /**
      * list ,  相当于java中的ArrayList
      * scala 默认的list  是不可变的
      *
      */

    val list = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 1)


    /**
      *
      * list中常用的方法
      * 下面所有的方法都不会修改源集合
      */

    //通过下表取数
    println(list(1))


    println(list.mkString(",")) //拼接成字符串
    println(list.head) //取第一个元素
    println(list.last) //取最后一个元素
    println(list.take(3)) //取前几个元素
    println(list.size)
    println(list.length)
    println(list.distinct) //去除重复元素
    println(list.reverse) //反转集合，返回一个新的集合
    println(list.tail) //返回不包含第一个元素所有的元素
    println(list.min) //取最小值
    println(list.max) //取最大值
    println(list.sum) //求和


    /**
      * 高级方法
      *
      */

    /**
      * map 函数
      * 将集合中的元素一个一个传递给后面的函数，最终返回一个新的集合
      * 数据行数不变，原来是多少行处理完还是多少行
      *
      */

    val list1: List[Int] = list.map((i: Int) => i * 2)

    println(list1)

    //取出所有的奇数
    /**
      * filter函数， 多集合中的元素进行过滤
      *
      * 后面的函数返回true 保留数据
      * 后面的函数返回false 过滤数据
      *
      * 集合的数据量会减少
      */

    val list2: List[Int] = list.filter((i: Int) => i % 2 == 1)
    println(list2)


    /**
      * sort 函数
      *
      * sortBy: 通过某一个字段进行排序，默认是升序
      * sortWith: 传入一个比较规则进行排序
      *
      */


    val sortList: List[Int] = list.sortBy((i: Int) => -i)
    println(sortList)

    val list5: List[Int] = list.sortWith((i: Int, j: Int) => i > j)
    println(list5)


    val strs = List("java,spark,hadoop,java", "hive,scala,hbase", "hive,scala,hbase", "flume,sqoop")


    /**
      * flatMap 函数
      *
      * 将集合中的元素按照一个分隔方法分隔成多行
      * 一行转换成多行
      *
      * 需要一个返回值为数组或者集合的函数
      *
      *
      */

    val words: List[String] = strs.flatMap((line: String) => line.split(","))

    println(words)

    /**
      * 结果数据不变--- map
      * 结果数据变少--- filter
      * 结果数据变多 -- flatMap
      *
      */

    /**
      *
      * groupBy  函数
      *
      * 通过某一个列进行分组，将同一个列分到同一个组内
      *
      */

    val map: Map[String, List[String]] = words.groupBy((word: String) => word)

    for (elem <- map) {
      println(elem)
    }

    /**
      * 遍历
      *
      * foreach:函数，遍历j集合
      * 将集合中的元素一个一个传递给后面的函数，没有返回值
      */

    for (elem <- list) {
      println(elem)
    }


    list.foreach((i: Int) => println(i))

    println("=" * 100)

    //简写
    list.foreach(i => println(i))

    println("=" * 100)

    list.foreach(println(_))

    println("=" * 100)

    //多态
    list.foreach(println)


  }

}
